#include <iostream>

using namespace std;

class SmallInt {
    // 1. 既提供了重载运算符
    friend SmallInt operator+(const SmallInt&, const SmallInt&);
    public:
        SmallInt(int i = 0): val(i) {};         // 转换源为 int 的类型转换
        // 2. 又提供了算术类型的类型转换
        operator int() const { return val; }    // 转换目标为 int 的类型转换
    private:
        size_t val;
};

SmallInt operator+(const SmallInt &lhs, const SmallInt &rhs)
{
    return SmallInt(lhs.val + rhs.val);
}

int main()
{
    SmallInt s1(1), s2(2);
    SmallInt s3 = s1 + s2;      // 使用重载的 operator+
    cout << s3 << endl;

    // 3. 则会有重载运算符与内置运算符的二义性问题
    // int i = s3 + 0;          // 二义性错误（0 转成 SmallInt 或者 s3 转成 int）
}